SWIVEL · 06 · DRAFT

Data Viz Palette

Six cool categorical hues anchored on slate and switch, single-hue sequential ramps, a slate ↔ coral diverging scale, and a 10-step slate → switch gradient for many-series stacks. All channels share a lightness curve so series read as one fabric.

CATEGORICAL · 6 SERIES

Six cool hues, anchored on slate and switch. Built as one tonal family rather than a hue wheel — every series lives between deep slate and cyan-teal so a chart reads as one fabric. Use in order: --viz-slate for the primary series, --viz-switch for the comparator, then deep → steel → mist → graphite. Past 6 series, switch to a sequential ramp or the many-series stack gradient below.

01
Slate--viz-slate · → --slate-base
02
Switch--viz-switch · → --switch-contrast
03
Deep--viz-deep · oklch(.30 .06 252)
04
Steel--viz-steel · oklch(.55 .09 235)
05
Mist--viz-mist · oklch(.78 .045 220)
06
Graphite--viz-graphite · → --graphite-70
Stacked bar · channel mix by week 6 series · 12 weeks · stacked
CTV Video Web Audio Display Native Retail Media
SEQUENTIAL · SINGLE-HUE RAMPS

Seven-step ramps with a shared lightness curve. Use for ordered magnitude — fill rate, density, percent-to-goal. Slate is the default; switch and warm offer an alternate temperature when slate would collide with brand chrome.

Slate--seq-slate-1…7
01
02
03
04
05
06
07
Switch--seq-switch-1…7
01
02
03
04
05
06
07
Warm--seq-warm-1…7
01
02
03
04
05
06
07
Heatmap · fill rate by hour --seq-slate · day × hour bucket
MANY-SERIES STACK · SLATE → SWITCH

A 10-step gradient from deep slate to light switch-cyan, anchored at both ends on brand tokens. Use when one automation or campaign breaks into 10+ near-identical slices that would overwhelm the categorical palette — treatment × region variants, ad-group splits, A/B/n cohorts. Darkest slate sits at the top of the stack so the dominant slice anchors the chart. --stack-other rides on top in graphite for the catch-all bucket.

01
02
03
04
05
06
07
08
09
10
other
Stacked area · one automation × 10 variants --stack-1…10 + --stack-other
DIVERGING · SLATE ↔ SWITCH

Nine-step diverging scale for plus/minus data — pacing variance, win-rate delta, lift over baseline. Luminance + chroma carry polarity instead of warm/cool, so the scale stays entirely in the slate / switch family. Deep slate reads "below," bright cyan reads "above," near-bg midpoint stays out of the way. For unambiguous good/bad (where red/green is meaningful), reach for the semantic --success / --error tokens instead.

−4
−3
−2
−1
0
+1
+2
+3
+4
−40%−30%−20%−10%0+10%+20%+30%+40%
Delta vs. plan · selected products --div-1…9 · centered on 0
STATUS · REFERENCE

Status colors are not categorical. Reuse the existing semantic tokens for state-bearing visualizations (uptime ribbons, run-state tiles, alert sparklines) so dashboards align with form validation and badge colors.

Success--success · #2E7D32
Warning--warning · #D96600
Error--error · #D32F2F
Info--info · #1976D2

Usage notes

  • Categorical first 3 are the comfort zone (slate → switch → deep). Past viz-4, audit the chart for fatigue. If you need a 7th series, switch to a sequential ramp or the many-series stack.
  • Sequential ramps never mix. Pick slate, switch, or warm — don't pivot mid-dashboard. The lightness curve is shared, so a slate heatmap and a switch heatmap encode the same percent at the same step.
  • Diverging is anchored at 0. Don't use it for ordered magnitude (use sequential); don't use it for categorical state (use status).
  • Status is not a series. Don't pull --error into a categorical chart just because the row is "bad" — encode state in shape, label, or annotation instead.